﻿using System.Transactions;
using Bootstrap;
using Bootstrap.AutoMapper;
using Dogshow.BusinessLogic.Utils;
using Dogshow.Model;
using DogshowRepository;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Linq;

namespace Dogshow.Linq2SQLRepository.Test
{
    [TestClass]
    public class KorisniciRepositoryFixtures
    {
        public IKorisniciRepository Repository { get; set; }

        [ClassInitialize]
        public static void ClassInit(TestContext ctx)
        {
            var model = new DogshowModel();
            if (model.DatabaseExists())
            {
                model.DeleteDatabase();
            }
            model.CreateDatabase();
            Bootstrapper.With.AutoMapper().Start();
            model.ExecuteCommand("INSERT INTO Mesta (PostanskiBroj, Naziv) VALUES ('14000', 'Valjevo')");
            model.ExecuteCommand("INSERT INTO Mesta (PostanskiBroj, Naziv) VALUES ('21131', 'Petrovaradin')");
            var lozinka = new Md5Encryptor().Encrypt("zeksiva");
            model.ExecuteCommand(string.Format("INSERT INTO Korisnici VALUES ('timit', 'Milan Timotić', CONVERT(VARBINARY(MAX), '{0}'), 1,'014/233-241', 'Radnicka 66', 1, 'rottor@sbb.rs', NULL, NULL, 1)", lozinka));
        }

        [TestInitialize]
        public void TestInit()
        {
            Repository = new KorisniciRepository();
        }

        [TestMethod]
        public void Sacuvaj_Novog_Korisnika()
        {
            using (new TransactionScope())
            {
                // Arrange
                var korisnik = new Korisnik
                {
                    KorisnickoIme = "zeks",
                    Naziv = "Željko Bajšanski",
                    VidljivaLozinka = "1302",
                    Adresa = "Preradovićeva 36",
                    IdMesta = 1,
                    Email = "zeljko.bajsanski@gmail.com",
                    Telefon = "063/528065"
                };
                korisnik.Lozinka = new Md5Encryptor().Encrypt(korisnik.VidljivaLozinka);

                // Act
                Repository.Sacuvaj(korisnik);

                // Assert
                var zeks = Repository.VratiPoKorisnickomImenu("zeks");
                Assert.IsNotNull(zeks);
                Assert.AreEqual(korisnik.Naziv, zeks.Naziv);
                Assert.IsNotNull(zeks.Lozinka);
                Assert.AreEqual("***************", zeks.VidljivaLozinka);
                Assert.AreEqual(korisnik.Adresa, zeks.Adresa);
                Assert.AreEqual(korisnik.IdMesta, zeks.IdMesta);
                Assert.AreEqual(korisnik.Email, zeks.Email);
                Assert.AreEqual(korisnik.Telefon, zeks.Telefon);
            }
        }

        [TestMethod]
        public void Izmeni_Podatke_Korisnika()
        {
            using (new TransactionScope())
            {
                // Arrange
                var user = Repository.VratiPoKorisnickomImenu("timit");
                user.Naziv = "Željko Bajšanski";
                user.Adresa = "Preradovićeva 36";
                user.IdMesta = 2;
                user.Telefon = "063/528 065";
                user.Email = "zeljko.bajsanski@gmail.com";
                user.Lozinka = null;

                // Act
                Repository.Sacuvaj(user);

                // Assert
                var timit = Repository.VratiPoKorisnickomImenu("timit");
                Assert.AreEqual(user.Naziv, timit.Naziv);
                //Assert.IsTrue(user.Lozinka.SequenceEqual(timit.Lozinka));
                Assert.AreEqual(user.Adresa, timit.Adresa);
                Assert.AreEqual(user.IdMesta, timit.IdMesta);
                Assert.AreEqual(user.Telefon, timit.Telefon);
                Assert.AreEqual(user.Email, timit.Email);
                Assert.IsNotNull(timit.Lozinka);
                Assert.IsFalse(timit.Lozinka.Length == 0);
            }
        }

        [TestMethod]
        public void Vrati_Sve_Korisnike()
        {
            // Act
            var svi = Repository.VratiSve().ToArray();

            // Assert
            Assert.AreEqual(1, svi.Length);
            Assert.AreEqual("timit", svi[0].KorisnickoIme);
        }
    }
}